package com.breeze.components.oss.service;

import static com.breeze.components.oss.mybaits.entity.table.FileDetailTable.FILE_DETAIL;

import cn.hutool.core.util.StrUtil;
import com.breeze.components.oss.mybaits.entity.FileDetailDo;
import com.breeze.components.oss.mybaits.mapper.FileDetailMapper;
import com.mybatisflex.core.query.If;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import java.util.Objects;
import org.dromara.x.file.storage.core.FileInfo;
import org.dromara.x.file.storage.core.recorder.FileRecorder;
import org.dromara.x.file.storage.core.upload.FilePartInfo;
import org.springframework.stereotype.Service;

/**
 * 文件记录表 服务层实现。
 *
 * @author breeze
 * @since 2024-05-13 10:08:23
 */
@Service
public class FileDetailService extends ServiceImpl<FileDetailMapper, FileDetailDo>
    implements FileRecorder {

  @Resource private FilePartDetailService filePartDetailService;

  /** 保存文件信息到数据库 */
  @Override
  public boolean save(FileInfo info) {
    var detail = FileDetailDo.toFileDetail(info);
    if (Objects.isNull(detail)) {
      return false;
    }
    var saved = save(detail);
    if (saved) {
      info.setId(String.valueOf(detail.getId()));
    }
    return saved;
  }

  /** 更新文件记录，可以根据文件 ID 或 URL 来更新文件记录， 主要用在手动分片上传文件-完成上传，作用是更新文件信息 */
  @Override
  public void update(FileInfo info) {
    var detail = FileDetailDo.toFileDetail(info);
    if (Objects.isNull(detail)) {
      return;
    }
    update(
        detail,
        query()
            .where(
                FILE_DETAIL
                    .ID
                    .eq(detail.getId(), If::notNull)
                    .and(FILE_DETAIL.URL.eq(detail.getUrl(), If::hasText))));
  }

  /** 根据 url 查询文件信息 */
  @Override
  public FileInfo getByUrl(String url) {
    if (StrUtil.isEmpty(url)) {
      return null;
    }
    return FileDetailDo.toFileInfo(queryChain().where(FILE_DETAIL.URL.eq(url)).one());
  }

  /** 根据 url 删除文件信息 */
  @Override
  public boolean delete(String url) {
    return remove(query().where(FILE_DETAIL.URL.eq(url)));
  }

  /**
   * 保存文件分片信息
   *
   * @param filePartInfo 文件分片信息
   */
  @Override
  public void saveFilePart(FilePartInfo filePartInfo) {
    filePartDetailService.saveFilePart(filePartInfo);
  }

  /** 删除文件分片信息 */
  @Override
  public void deleteFilePartByUploadId(String uploadId) {
    filePartDetailService.deleteFilePartByUploadId(uploadId);
  }
}
